home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / devel / vbcc-src / vcpp / hideset.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  2KB  |  111 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "cpp.h"
  5.  
  6. /*
  7.  * A hideset is a null-terminated array of Nlist pointers.
  8.  * They are referred to by indices in the hidesets array.
  9.  * Hideset 0 is empty.
  10.  */
  11.  
  12. #define    HSSIZ    32
  13. typedef    Nlist    **Hideset;
  14. Hideset    *hidesets;
  15. int    nhidesets = 0;
  16. int    maxhidesets = 3;
  17. int    inserths(Hideset, Hideset, Nlist *);
  18.  
  19. /*
  20.  * Test for membership in a hideset
  21.  */
  22. int
  23. checkhideset(int hs, Nlist *np)
  24. {
  25.     Hideset hsp;
  26.  
  27.     if (hs>=nhidesets)
  28.         abort();
  29.     for (hsp = hidesets[hs]; *hsp; hsp++) {
  30.         if (*hsp == np)
  31.             return 1;
  32.     }
  33.     return 0;
  34. }
  35.  
  36. /*
  37.  * Return the (possibly new) hideset obtained by adding np to hs.
  38.  */
  39. int
  40. newhideset(int hs, Nlist *np)
  41. {
  42.     int i, len;
  43.     Nlist *nhs[HSSIZ+3];
  44.     Hideset hs1, hs2;
  45.  
  46.     len = inserths(nhs, hidesets[hs], np);
  47.     for (i=0; i<nhidesets; i++) {
  48.         for (hs1=nhs, hs2=hidesets[i]; *hs1==*hs2; hs1++, hs2++)
  49.             if (*hs1 == NULL)
  50.                 return i;
  51.     }
  52.     if (len>=HSSIZ)
  53.         return hs;
  54.     if (nhidesets >= maxhidesets) {
  55.         maxhidesets = 3*maxhidesets/2+1;
  56.         hidesets = (Hideset *)realloc(hidesets, (sizeof (Hideset *))*maxhidesets);
  57.     }
  58.     hs1 = (Hideset)domalloc(len*sizeof(Hideset));
  59.     memmove(hs1, nhs, len*sizeof(Hideset));
  60.     hidesets[nhidesets] = hs1;
  61.     return nhidesets++;
  62. }
  63.  
  64. int
  65. inserths(Hideset dhs, Hideset shs, Nlist *np)
  66. {
  67.     Hideset odhs = dhs;
  68.  
  69.     while (*shs && *shs < np)
  70.         *dhs++ = *shs++;
  71.     if (*shs != np)
  72.         *dhs++ = np;
  73.     do {
  74.         *dhs++ = *shs;
  75.     } while (*shs++);
  76.     return dhs - odhs;
  77. }
  78.  
  79. /*
  80.  * Hideset union
  81.  */
  82. int
  83. unionhideset(int hs1, int hs2)
  84. {
  85.     Hideset hp;
  86.  
  87.     for (hp = hidesets[hs2]; *hp; hp++)
  88.         hs1 = newhideset(hs1, *hp);
  89.     return hs1;
  90. }
  91.  
  92. void
  93. iniths(void)
  94. {
  95.     hidesets = (Hideset *)domalloc(maxhidesets*sizeof(Hideset *));
  96.     hidesets[0] = (Hideset)domalloc(sizeof(Hideset));
  97.     *hidesets[0] = NULL;
  98.     nhidesets++;
  99. }
  100.  
  101. void
  102. prhideset(int hs)
  103. {
  104.     Hideset np;
  105.  
  106.     for (np = hidesets[hs]; *np; np++) {
  107.         fprintf(stderr, (char*)(*np)->name, (*np)->len);
  108.         fprintf(stderr, " ");
  109.     }
  110. }
  111.